package com.china08.yxyapi.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.stereotype.Component;

import com.china08.yxyapi.SystemConstant;

/**
 * 
 * 常用正则验证工具类
 * 
 */
@Component
public class RegexValidateUtil {

    /**
     * 匹配email地址
     * 
     * 格式: XXX@XXX.XXX.XX
     * 
     * 匹配 : foo@bar.com 或 foobar@foobar.com.au
     * 
     * 不匹配: foo@bar 或 $$$@bar.com
     * 
     */
    public static final String EMAIL_REGEXP = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";

    /**
     * 
     * 验证手机号码
     * 
     * 格式为: 11 位 (XXXXXXXXXXX)
     * 
     * 匹配 : 15623568956
     * 
     * 
     * 不匹配: 01235644251
     * 
     */
    public static final String MOBILE_REGEXP = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";

    /**
     * 匹配电话
     * 
     * 
     * 格式为: 0XXX-XXXXXX(10-13位首位必须为0) 或0XXX XXXXXXX(10-13位首位必须为0) 或
     * 
     * (0XXX)XXXXXXXX(11-14位首位必须为0) 或 XXXXXXXX(6-8位首位不为0) 或
     * XXXXXXXXXXX(11位首位不为0)
     * 
     * 
     * 匹配 : 0371-123456 或 (0371)1234567 或 (0371)12345678 或 010-123456 或
     * 010-12345678 或 12345678912
     * 
     * 
     * 不匹配: 1111-134355 或 0123456789
     * 
     */
    public static final String PHONE_REGEXP = "^(?:0[0-9]{2,3}[-//s]{1}|//(0[0-9]{2,4}//))[0-9]{6,8}$|^[1-9]{1}[0-9]{5,7}$|^[1-9]{1}[0-9]{10}$";

    /**
     * 匹配匹配并提取url
     * 
     * 格式: XXXX://XXX.XXX.XXX.XX/XXX.XXX?XXX=XXX
     * 
     * 匹配 : http://www.suncer.com 或news://www
     * 
     * 不匹配: c:/window
     */
    public static final String URL_REGEXP = "(//w+)://([^/:]+)(://d*)?([^#//s]*)";

    /**
     * 匹配并提取http
     * 
     * 格式: http://XXX.XXX.XXX.XX/XXX.XXX?XXX=XXX 或 ftp://XXX.XXX.XXX 或
     * https://XXX
     * 
     * 匹配 : http://www.suncer.com:8080/index.html?login=true
     * 
     * 不匹配: news://www
     * 
     */
    public static final String HTTP_REGEXP = "(http|https|ftp)://([^/:]+)(://d*)?([^#//s]*)";

    /**
     * 匹配IP
     * 
     * 格式(首位不为0): XXX.XXX-XXX或 XXX-XX-X
     * 
     * 匹配 : 192.168.2.112
     * 
     * 不匹配: 1562.123.562.1
     * 
     */
    public static final String IP_REGEXP = "\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b";

    /**
     * 验证日期 <br>
     * 
     * 格式(首位不为0): 0000-00-00
     * 
     * 匹配 : 2005-04-04
     * 
     * 不匹配: 01-01-01
     * 
     * 注:解决闰年问题
     */
    public static final String DATE_REGEXP = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$";

    /**
     * 匹配日期
     * 
     * 格式(首位不为0): XXXX-XX-XX或 XXXX-X-X
     * 
     * 范围:1900--2099
     * 
     * 匹配 : 2005-04-04
     * 
     * 不匹配: 01-01-01
     * 
     */
    public static final String DATE_BARS_REGEXP = "^((((19){1}|(20){1})\\d{2})|\\d{2})-[0,1]?\\d{1}-[0-3]?\\d{1}$";

    /**
     * 匹配日期
     * 
     * 格式: XXXX/XX/XX
     * 
     * 范围:
     * 
     * 匹配 : 2005/04/04
     * 
     * 不匹配: 01/01/01
     * 
     */
    public static final String DATE_SLASH_REGEXP = "^[0-9]{4}/(((0[13578]|(10|12))/(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)/(0[1-9]|[1-2][0-9]|30)))$";

    /**
     * 匹配身份证
     * 
     * 格式为: XXXXXXXXXX(10位) 或 XXXXXXXXXXXXX(13位) 或 XXXXXXXXXXXXXXX(15位) 或
     * XXXXXXXXXXXXXXXXXX(18位)
     * 
     * 匹配 : 0123456789123
     * 
     * 不匹配: 0123456
     * 
     */
    public static final String ID_CARD_REGEXP = "^//d{10}|//d{13}|//d{15}|//d{18}$";

    /**
     * 匹配邮编代码
     * 
     * 格式为: XXXXXX(6位)
     * 
     * 匹配 : 012345
     * 
     * 不匹配: 0123456
     * 
     */
    public static final String ZIP_REGEXP = "^[0-9]{6}$";

    /**
     * 匹配图象
     * 
     * 
     * 格式: /相对路径/文件名.后缀 (后缀为gif,dmp,png)
     * 
     * 匹配 : /forum/head_icon/admini2005111_ff.gif 或 admini2005111.dmp
     * 
     * 
     * 不匹配: c:/admins4512.gif
     * 
     */
    public static final String ICON_REGEXP = "^(/{0,1}//w){1,}//.(gif|dmp|png|jpg)$|^//w{1,}//.(gif|dmp|png|jpg)$";

    /**
     * 不包括特殊字符的匹配 (字符串中不包括符号 数学次方号^ 单引号' 双引号" 分号; 逗号, 帽号: 数学减号- 右尖括号> 左尖括号< 反斜杠/
     * 即空格,制表符,回车符等 )
     * 
     * 格式为: x 或 一个一上的字符
     * 
     * 匹配 : 012345
     * 
     * 不匹配: 0123456 // ;,:-<>//s].+$";//
     */
    public static final String NON_SPECIAL_CHAR_REGEXP = "^[^'/";

    /**
     * 是否包含数字
     * 
     * 格式 oooxxxxoooooxxxxx
     * 
     * 匹配 abc1233dd456
     * 
     * 不匹配 abcddd
     * 
     */
    public static final String NUMBER_REGEXP = "^(?=.*\\d.*)";

    /**
     * 是否包含小写字母
     * 
     * 格式 oooxxxxoooooxxxxx
     * 
     * 匹配 AAAAABdddd
     * 
     * 不匹配 EEEE
     * 
     */
    public static final String LOWERCASE_LETTERS_REGEXP = "^(?=.*[a-z].*)";

    /**
     * 是否包含大写字母
     * 
     * 格式 oooxxxxoooooxxxxx
     * 
     * 匹配 AAAAABdddd
     * 
     * 不匹配 abcc
     * 
     */
    public static final String CAPITAL_LETTERS_REGEXP = "^(?=.*[A-Z].*)";

    /**
     * 是否包含特殊字符
     * 
     * 匹配 ;,:-<>//s].+$";//
     * 
     * 不匹配 abcc
     * 
     */
    public static final String SPECIAL_CHARACTER_REGEXP = "^(?=[^0-9A-Za-z])";

    /**
     * 基础的验证工具
     * 
     * @param regexStr
     *            正则表达式
     * @param validateStr
     *            要验证的字符串
     * @return
     */
    public static boolean regExpValidate(String regexStr, String validateStr) {
        Pattern pattern = Pattern.compile(regexStr);
        Matcher matcher = pattern.matcher(validateStr);
        return matcher.matches();
    }

    /**
     * 
     * 获取密码强度 或者 检测密码强度
     * 
     */
    public static String getPasswordStrong(String password) {

        int lv = 0;
        if (regExpValidate(NUMBER_REGEXP, password)) {// 是否包含数字
            lv++;
        }
        if (regExpValidate(LOWERCASE_LETTERS_REGEXP, password)) {// 是否包含小写字母
            lv++;
        }
        if (regExpValidate(CAPITAL_LETTERS_REGEXP, password)) {// 是否包含大写字母
            lv++;
        }
        if (regExpValidate(SPECIAL_CHARACTER_REGEXP, password)) {// 是否包含特殊字符
            lv++;
        }

        if (password.trim().length() < 6) {
            lv = 0;
        }
        if (lv > 4) {
            lv = 4;
        }
        return SystemConstant.PasswordStrongType.getDescription(SystemConstant.PasswordStrongType.valueOf("LV" + lv));
    }

}
